//求环的入口点
//给定一个链表的头节点  head ，返回链表开始入环的第一个节点。 如果链表无环，则返回 null。
// 思路一：找环和线的交点（以相遇点为基点，从相遇点到相遇点算一个环，将线上的点依次在环上遍历，第一个在环上的点就是环入口点）
struct ListNode *detectCycle(struct ListNode *head) {
        if (!head || !head->next)
               return NULL;
        struct ListNode* p1 = head;
        struct ListNode* p2 = head->next;
        struct ListNode* prev = NULL;
//判断是否带环
        while (p1 != p2) {
               if (!p2 || !p2->next)
                       return NULL;
               prev = p2;
               p1 = p1->next;
               p2 = p2->next->next;
        }
//走出while循环说明该链表带环，相遇点为p1，在环内
        struct ListNode* tmp = p1;
        struct ListNode* cur = head;
        prev = prev->next;//prev是p2的上一个节点
        while(cur){
               while (tmp != prev)
               {
                       if (tmp == cur)
                              return tmp;//相遇点
                       tmp = tmp->next;//环的遍历循环
               }
               cur = cur->next;//线的遍历循环
        }
        return NULL;
}
